poj 2243

Floyd神题、
问棋盘上任意两点之间的象棋最少移动次数。询问量太大,不好用dfs.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define mem(x,y) memset(x,y,sizeof(x))
#define maxn 50008
#define maxe 400008
#define inf 0x3f3f3f3f
#define mp(x,y) make_pair(x,y)
using namespace std;
bool cango(int x,int y)
{

return x>=0&&x<8&&y>=0&&y<8;
}
int X[]={-1,-2,1,2,1,2,-1,-2},Y[]={-2,-1,-2,-1,2,1,2,1};
int a[80][80];
int main()
{

for(int i=0;i<64;i++)
for(int j=0;j<64;j++)
a[i][j]=inf;
for(int i=0;i<64;i++)
a[i][i]=0;
for(int i=0;i<64;i++)
{
for(int k=0;k<8;k++)
if(cango(i/8+X[k],i%8+Y[k]))
a[i][(i/8+X[k])*8+i%8+Y[k]]=1;
}
for(int k=0;k<64;k++)
for(int i=0;i<64;i++)
for(int j=0;j<64;j++)
{
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
char s1[5],s2[5];
while(~scanf("%s%s",s1,s2))
{
printf("To get from %s to %s takes ",s1,s2);
int x1=s1[0]-'a',x2=s2[0]-'a';
int y1=s1[1]-'1',y2=s2[1]-'1';
int x=x1*8+y1;
int y=x2*8+y2;
printf("%d knight moves.\n",a[x][y]);
}
}

EOF